package cn.demoncat.util.excel.entity;

import lombok.Data;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.HorizontalAlignment;

/**
 * Excel表格的标题字段：设置字段名、字段标题名、格式化、列宽
 * 
 * @author 延晓磊
 *
 * @since 2016年8月19日
 */
@Data
public class HeadField{

	// 字段名：对象的属性、Map的键、内置字段（FieldName），用于获取列的数据
	private String field;
	// 字段标题：显示在表格的头部，作为列的标题
	private String title;
	// 数据格式化：默认TEXT。日期类型格式化为字符串。数字类型不设置时输出字符串，设置时转换为double由POI转换。其它类型输出字符串。
	private FieldFormat format = FieldFormat.TEXT;
	// 列宽(字数)：指定字段列最多几个字，默认为字段标题字数+10
	private Integer width;
	// 水平对齐方式：默认居中，只支持LEFT,CENTER,RIGHT
	private HorizontalAlignment align;
	// 字体颜色
	private HSSFColor.HSSFColorPredefined color = HSSFColor.HSSFColorPredefined.BLACK;
	// 是否为list类型（用于[列]合并单元格）
	private boolean list = false;
	// 是否为函数：true cell.setCellFormula(), false cell.setCellValue()
	private boolean fx = false;
	
	/**
	 * 默认构造
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年12月27日
	 */
	public HeadField() {
		super();
	}
	
	/**
	 * 构建Excel表格的头部字段
	 * 
	 * @param field 	字段名：对象的属性、Map的键，用于获取列的数据
	 * @param title 	字段标题：显示在表格的头部，作为列的标题
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年12月27日
	 */
	public static HeadField build(String field, String title) {
		return new HeadField(field, title, null, null, null, false);
	}

	/**
	 * 构建Excel表格的头部字段 - 序号
	 * 
	 * @return
	 * 
	 * @author 延晓磊
	 * @since 2023年01月12日
	 */
	public static HeadField buildIndex(){
		return build(FieldName.INDEX, "序号");
	}
	
	/**
	 * 设置格式
	 * 
	 * @param format	默认TEXT。日期类型格式化为字符串。数字类型不设置时输出字符串，设置时转换为double由POI转换
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年12月27日
	 */
	public HeadField format(FieldFormat format) {
		if (format == null) {
			this.format = FieldFormat.TEXT;
		}else {
			this.format = format;
		}
		return this;
	}
	
	/**
	 * 设置列宽(字数)
	 * 
	 * @param width 	指定字段列最多几个字，默认为字段标题字数+10
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年12月27日
	 */
	public HeadField width(Integer width) {
		if (width == null || width <1) {
			this.width = title.length()*2 + 10;
		}else {
			this.width = width;
		}
		return this;
	}
	
	/**
	 * 设置水平对齐方式
	 * 
	 * @param align 	默认居中，只支持LEFT,CENTER,RIGHT
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年12月27日
	 */
	public HeadField align(HorizontalAlignment align) {
		if (align == null) {
			this.align = HorizontalAlignment.CENTER;
		}else if(align.equals(HorizontalAlignment.CENTER) || align.equals( HorizontalAlignment.LEFT) || align.equals(HorizontalAlignment.RIGHT)){
			this.align = align;
		}else {
			throw new IllegalArgumentException("只支持CENTER、LEFT、RIGHT水平对齐");
		}
		return this;
	}

	/**
	 * 设置字体颜色
	 *
	 * @param color
	 * @return
	 *
	 * @author 延晓磊
	 * @since 2023年10月20日
	 */
	public HeadField color(HSSFColor.HSSFColorPredefined color){
		this.color = color;
		return this;
	}
	
	/**
	 * 设置为合并单元格(列)的字段，字段对应的数据为List
	 * 
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年12月27日
	 */
	public HeadField list() {
		this.list = true;
		return this;
	}

	/**
	 * 设置为函数数据
	 *
	 * @return
	 *
	 * @author 延晓磊
	 * @since 2023年10月20日
	 */
	public HeadField fx() {
		this.fx = true;
		if (FieldFormat.TEXT.equals(this.format)) {
			this.format = FieldFormat.GENERAL;
		}
		return this;
	}
	
	/**
	 * 创建表头字段
	 * 
	 * @param field 字段名：对象的属性、Map的键，用于获取列的数据
	 * @param title 字段标题：显示在表格的头部，作为列的标题
	 */
	public HeadField(String field, String title) {
		this(field, title, null, null, null);
	}
	
	/**
	 * 创建表头字段
	 * 
	 * @param field 字段名：对象的属性、Map的键，用于获取列的数据
	 * @param title 字段标题：显示在表格的头部，作为列的标题
	 * @param format 日期、数字类型的格式化
	 */
	public HeadField(String field, String title,FieldFormat format) {
		this(field, title, format, null, null);
	}
	
	/**
	 * 创建表头字段
	 * 
	 * @param field 字段名：对象的属性、Map的键，用于获取列的数据
	 * @param title 字段标题：显示在表格的头部，作为列的标题
	 * @param format 日期、数字类型的格式化
	 * @param width 列宽：指定字段列最多几个字，默认为字段标题字数+10
	 */
	public HeadField(String field, String title,FieldFormat format, Integer width) {
		this(field, title, format, width, null);
	}
	
	/**
	 * 创建表头字段
	 * 
	 * @param field 字段名：对象的属性、Map的键，用于获取列的数据
	 * @param title 字段标题：显示在表格的头部，作为列的标题
	 * @param align 水平对齐，默认居中，只支持LEFT,CENTER,RIGHT
	 */
	public HeadField(String field, String title,HorizontalAlignment align) {
		this(field, title, null, null, align);
	}
	
	/**
	 * 创建表头字段
	 * 
	 * @param field 字段名：对象的属性、Map的键，用于获取列的数据
	 * @param title 字段标题：显示在表格的头部，作为列的标题
	 * @param width 列宽：指定字段列最多几个字，默认为字段标题字数+10
	 * @param align 水平对齐，默认居中，只支持LEFT,CENTER,RIGHT
	 */
	public HeadField(String field, String title, Integer width,HorizontalAlignment align) {
		this(field, title, null, width, align);
	}
	
	/**
	 * 创建表头字段
	 * 
	 * @param field 字段名：对象的属性、Map的键，用于获取列的数据
	 * @param title 字段标题：显示在表格的头部，作为列的标题
	 * @param width 列宽：指定字段列最多几个字，默认为字段标题字数+10
	 */
	public HeadField(String field, String title, Integer width) {
		this(field, title, null, width, null);
	}

	/**
	 * 创建表头字段
	 * 
	 * @param field 字段名：对象的属性、Map的键，用于获取列的数据
	 * @param title 字段标题：显示在表格的头部，作为列的标题
	 * @param isList 是否为list类型字段
	 */
	public HeadField(String field, String title,boolean isList) {
		this(field, title, null, null, null,isList);
	}
	
	/**
	 * 创建表头字段
	 * 
	 * @param field 字段名：对象的属性、Map的键，用于获取列的数据
	 * @param title 字段标题：显示在表格的头部，作为列的标题
	 * @param format 日期、数字类型的格式化
	 * @param isList 是否为list类型字段
	 */
	public HeadField(String field, String title,FieldFormat format,boolean isList) {
		this(field, title, format, null, null,isList);
	}
	
	/**
	 * 创建表头字段
	 * 
	 * @param field 字段名：对象的属性、Map的键，用于获取列的数据
	 * @param title 字段标题：显示在表格的头部，作为列的标题
	 * @param format 日期、数字类型的格式化
	 * @param width 列宽：指定字段列最多几个字，默认为字段标题字数+10
	 * @param isList 是否为list类型字段
	 */
	public HeadField(String field, String title,FieldFormat format, Integer width,boolean isList) {
		this(field, title, format, width, null,isList);
	}
	
	/**
	 * 创建表头字段
	 * 
	 * @param field 字段名：对象的属性、Map的键，用于获取列的数据
	 * @param title 字段标题：显示在表格的头部，作为列的标题
	 * @param align 水平对齐，默认居中，只支持LEFT,CENTER,RIGHT
	 * @param isList 是否为list类型字段
	 */
	public HeadField(String field, String title,HorizontalAlignment align,boolean isList) {
		this(field, title, null, null, align,isList);
	}
	
	/**
	 * 创建表头字段
	 * 
	 * @param field 字段名：对象的属性、Map的键，用于获取列的数据
	 * @param title 字段标题：显示在表格的头部，作为列的标题
	 * @param width 列宽：指定字段列最多几个字，默认为字段标题字数+10
	 * @param align 水平对齐，默认居中，只支持LEFT,CENTER,RIGHT
	 * @param isList 是否为list类型字段
	 */
	public HeadField(String field, String title, Integer width,HorizontalAlignment align,boolean isList) {
		this(field, title, null, width, align,isList);
	}
	
	/**
	 * 创建表头字段
	 * 
	 * @param field 字段名：对象的属性、Map的键，用于获取列的数据
	 * @param title 字段标题：显示在表格的头部，作为列的标题
	 * @param width 列宽：指定字段列最多几个字，默认为字段标题字数+10
	 * @param isList 是否为list类型字段
	 */
	public HeadField(String field, String title, Integer width,boolean isList) {
		this(field, title, null, width, null,isList);
	}
	
	/**
	 * 创建表头字段
	 * 
	 * @param field 字段名：对象的属性、Map的键，用于获取列的数据
	 * @param title 字段标题：显示在表格的头部，作为列的标题
	 * @param format 日期、数字类型的格式化
	 * @param width 列宽：指定字段列最多几个字，默认为字段标题字数+10
	 * @param align 水平对齐，默认居中，只支持LEFT,CENTER,RIGHT
	 */
	public HeadField(String field, String title,FieldFormat format, Integer width,HorizontalAlignment align) {
		this(field, title, format, width, align, false);
	}
	
	/**
	 * 创建表头字段
	 * 
	 * @param field 	字段名：对象的属性、Map的键，用于获取列的数据
	 * @param title 	字段标题：显示在表格的头部，作为列的标题
	 * @param format 	日期、数字类型的格式化
	 * @param width 	列宽：指定字段列最多几个字，默认为字段标题字数+10
	 * @param align 	水平对齐，默认居中，只支持LEFT,CENTER,RIGHT
	 * @param isList 	是否为list类型字段（用于[列]合并单元格）
	 */
	public HeadField(String field, String title,FieldFormat format, Integer width, HorizontalAlignment align, boolean isList) {
		super();
		this.field = field;
		this.title = title;
		if (format != null) {
			this.format = format;
		}
		this.width = (width == null || width <1) ? title.length()*2 + 10 : width;
		if (align == null) {
			this.align = HorizontalAlignment.CENTER;
		}else if(align.equals(HorizontalAlignment.CENTER) || align.equals( HorizontalAlignment.LEFT) || align.equals(HorizontalAlignment.RIGHT)){
			this.align = align;
		}else {
			throw new IllegalArgumentException("只支持CENTER、LEFT、RIGHT水平对齐");
		}
		this.list = isList;
	}


}
